package com.leecode.xiehf.page_01;

/**
 * 给定两个以字符串形式表示的非负整数 num1 和 num2，返回 num1 和 num2 的乘积，它们的乘积也表示为字符串形式。
 * <p>
 * 示例 1:
 * <p>
 * 输入: num1 = "2", num2 = "3"
 * 输出: "6"
 * 示例 2:
 * <p>
 * 输入: num1 = "123", num2 = "456"
 * 输出: "56088"
 * 说明：
 * <p>
 * num1 和 num2 的长度小于110。
 * num1 和 num2 只包含数字 0-9。
 * num1 和 num2 均不以零开头，除非是数字 0 本身。
 * 不能使用任何标准库的大数类型（比如 BigInteger）或直接将输入转换为整数来处理。
 * 通过次数12
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/multiply-strings
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Solution_0043 {

    public static void main(String[] args) {
        Solution_0043 solution = new Solution_0043();
        String result = solution.multiply("2", "3");
        System.out.println(result);
    }

    public String multiply(String num1, String num2) {
        int n = num1.length(), m = num2.length();
        int[] res = new int[n + m];
        for (int i = n - 1; i >= 0; i--) {
            for (int j = m - 1; j >= 0; j--) {
                int a = num1.charAt(i) - '0';
                int b = num2.charAt(j) - '0';
                int r = a * b;
                r += res[i + j + 1];
                res[i + j + 1] = r % 10;
                res[i + j] += r / 10;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n + m; i++) {
            if (sb.length() == 0 && res[i] == 0) continue;
            sb.append(res[i]);
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }

    /**
     * @param num1
     * @param num2
     * @return
     */
    public String multiply1(String num1, String num2) {
        if (num1 == null || num1.length() == 0) {
            return "";
        }
        if (num2 == null || num2.length() == 0) {
            return "";
        }
        if (num1.equals("0") || num2.equals("0")) {
            return "0";
        }
        int len1 = num1.length();
        String s = "0";
        StringBuilder zero = new StringBuilder();
        for (int i = len1 - 1; i >= 0; i--) {
            int n = num1.charAt(i) - '0';
            if (n > 0) {
                s = add(s, mul(num2, n) + zero);
            }
            zero.append("0");
        }
        return s;
    }

    private String mul(String nums, int n) {
        StringBuilder sb = new StringBuilder();
        int pre = 0;
        for (int i = nums.length() - 1; i >= 0; i--) {
            int a = nums.charAt(i) - '0';
            int mul = a * n + pre;
            sb.append(mul % 10);
            pre = mul / 10;
        }
        if (pre > 0) {
            sb.append(pre);
        }
        return sb.reverse().toString();
    }

    /**
     * 字符串相加
     *
     * @param num1
     * @param num2
     * @return
     */
    private String add(String num1, String num2) {
        if (num1.length() == 0) {
            return num2;
        }
        if (num2.length() == 0) {
            return num1;
        }
        if (num1.length() < num2.length()) {
            String temp = num1;
            num1 = num2;
            num2 = temp;
        }
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        int pre = 0;
        StringBuilder sb = new StringBuilder();
        for (; j >= 0 && i >= 0; j--, i--) {
            int a = num1.charAt(i) - '0';
            int b = num2.charAt(j) - '0';
            int sum = a + b + pre;
            sb.append(sum % 10);
            pre = sum / 10;
        }
        if (num2.length() == num1.length()) {
            if (pre > 0) {
                sb.append(pre);
            }
            return sb.reverse().toString();
        } else {
            for (int k = num1.length() - num2.length() - 1; k >= 0; k--) {
                int a = num1.charAt(k) - '0';
                int sum = a + pre;
                sb.append(sum % 10);
                pre = sum / 10;
            }
            if (pre > 0) {
                sb.append(pre);
            }
            return sb.reverse().toString();
        }
    }
}
